home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / c / vbcc / machines / amiga68k / libsrc / fd2lib.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-10-26  |  6.0 KB  |  171 lines

  1. /*  fd2lib  by Volker Barthelmann   */
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6.  
  7. #define MAXLEN 1000
  8.  
  9. #define check if(*p==0){printf("Parse error(0)\n");exit(EXIT_FAILURE);}
  10.  
  11. char *regnames[]={"a0","a1","a2","a3","a4","a5","a6","a7",
  12.                   "d0","d1","d2","d3","d4","d5","d6","d7"};
  13.  
  14. #define SMALLCODE 1
  15. #define SMALLDATA 2
  16.  
  17. char *varargs[]={
  18. #include "vargs.h"
  19. 0,0
  20. };
  21.  
  22. void ProcessFD(char *name,int mode)
  23. {
  24.     FILE *fd,*out,*lvos;
  25.     int offset=0,public=0,i,j,count,savecount;
  26.     char function[MAXLEN],ff[MAXLEN+8],base[MAXLEN],line[MAXLEN];
  27.     char lvoname[MAXLEN],*p,*k,*functionp;
  28.     int reg[16],loops;
  29.     *function=*base=*line=0;
  30.     fd=fopen(name,"r");
  31.     if(!fd){printf("Could not open <%s>\n",name);exit(EXIT_FAILURE);}
  32.     k=name;
  33.     if(p=strrchr(k,'/')) k=p+1;
  34.     if(p=strrchr(k,':')) k=p+1;
  35.     sprintf(lvoname,"T:%s_LVO.s",k);
  36.     lvos=fopen(lvoname,"w");
  37.     if(!lvos){printf("Could not create <%s>\n",lvoname);exit(EXIT_FAILURE);}
  38.     while(1){
  39.         if(!fgets(line,MAXLEN-1,fd)){printf("File error\n");exit(EXIT_FAILURE);}
  40.         if(*line=='*') continue;
  41.         if(!strncmp(line,"##base",6)){
  42.             p=line+6;while(isspace(*p)) p++;
  43.             k=base;while(isgraph(*p)) *k++=*p++;
  44.             *k=0;continue;
  45.         }
  46.         if(!strncmp(line,"##bias",6)){
  47.             p=line+6;while(isspace(*p)) p++;
  48.             sscanf(p,"%i",&offset);continue;
  49.         }
  50.         if(!strncmp(line,"##public",8)){
  51.             public=1;continue;
  52.         }
  53.         if(!strncmp(line,"##private",9)){
  54.             public=0;continue;
  55.         }
  56.         if(!strncmp(line,"##end",5)) return;
  57.         if(!public) {offset+=6;continue;}
  58.         functionp=function;
  59.         for(loops=0;loops<=1;loops++){
  60.             p=line;k=functionp;
  61.             while(isspace(*p)) p++;
  62.             if(loops==0){
  63.                 while(*p!='('&&*p!=0) *k++=*p++;
  64.                 check
  65.                 *k=0;
  66.                 fprintf(lvos,"_LVO%s\tequ\t-%d\n\txdef\t_LVO%s\n",functionp,offset,functionp);
  67.             }else{
  68.                 while(*p!='('&&*p!=0) p++;
  69.                 check;
  70.             }
  71. /*            printf("function=%s, loops=%d\n",functionp,loops);*/
  72.             count=savecount=0;
  73.             strcpy(ff,"T:");
  74.             strcat(ff,functionp);strcat(ff,".s");
  75.             out=fopen(ff,"w");
  76.             if(!out){printf("Could not create <%s>\n",functionp);exit(EXIT_FAILURE);}
  77.             if(mode&SMALLDATA) fprintf(out,"\tnear\ta4,-2\n");
  78.             if(mode&SMALLCODE) fprintf(out,"\tnear\tcode\n");
  79.             if(*base) fprintf(out,"\txref\t%s\n",base);
  80.             fprintf(out,"\txdef\t_%s\n",functionp);
  81.             fprintf(out,"\tsection\t\"CODE\",code\n_%s\n",functionp);
  82.             for(i=0;i<16;i++) reg[i]=0;
  83.             while(*p!=')'&&*p!=0) p++;
  84.             check
  85.             p++;
  86.             while(*p!='('&&*p!=0) p++;
  87.             check
  88.             p++;
  89.             while(*p!=')'&&*p!=0){
  90.                 if((*p!='a'&&*p!='A'&&*p!='d'&&*p!='D')||p[1]<'0'||p[1]>'7')
  91.                     {printf("Parse error(1)\n");exit(EXIT_FAILURE);}
  92.                 if(*p=='a') j=p[1]-'0';
  93.                     else    j=p[1]-'0'+8;
  94.                 reg[j]=++count;if(j!=0&&j!=1&&j!=8&&j!=9&&j!=6) savecount++;
  95.                 p+=2;
  96.                 while(isspace(*p)&&*p!=0) p++;
  97.                 if(*p=='/'||*p==',') p++;
  98.                 else if(*p!=')'){printf("Parse error(2)\n");exit(EXIT_FAILURE);}
  99.                 while(isspace(*p)&&*p!=0) p++;
  100.                 check
  101.             }
  102.             if(savecount==0) fprintf(out,"\tmove.l\ta6,-(a7)\n");
  103.             else{
  104.                 fprintf(out,"\tmovem.l\ta6");
  105.                 for(i=0;i<16;i++){
  106.                     if(reg[i]&&i!=0&&i!=1&&i!=8&&i!=9&&i!=6) fprintf(out,"/%s",regnames[i]);
  107.                     if(reg[i]&&(i==6/*||((mode&SMALLDATA)&&i==4)*/))
  108.                         printf("WARNING: register conflict in %s!\n",functionp);
  109.                 }
  110.                 fprintf(out,",-(a7)\n");
  111.             }
  112.             for(j=1;j<=count;j++)
  113.                 for(i=0;i<16;i++)
  114.                     if(reg[i]==j)
  115.                         if(i>=15||reg[i+1]!=j+1||(loops==1&&j>=count-1)){
  116.                             if(loops==0||j<count)
  117.                                 fprintf(out,"\tmove.l\t%d(a7),%s\n",4*(savecount+j+1),regnames[i]);
  118.                             else
  119.                                 fprintf(out,"\tlea\t%d(a7),%s\n",4*(savecount+j+1),regnames[i]);
  120.                         }else{
  121.                             fprintf(out,"\tmovem.l\t%d(a7),%s",4*(savecount+j+1),regnames[i]);
  122.                             while(i<15&®[i+1]==j+1&&(loops==0||j<count-1)){
  123.                                 i++;j++;
  124.                                 fprintf(out,"/%s",regnames[i]);
  125.                             }
  126.                             fprintf(out,"\n");
  127.                         }
  128.  
  129.             if(*base){
  130.                 fprintf(out,"\tmove.l\t%s",base);
  131.                 if(mode&SMALLDATA) fprintf(out,"(a4)");
  132.                 fprintf(out,",a6\n");
  133.             }
  134.             fprintf(out,"\tjsr\t-%d(a6)\n",offset);
  135.             if(savecount==0) fprintf(out,"\tmove.l\t(a7)+,a6");
  136.                 else     fprintf(out,"\tmovem.l\t(a7)+,a6");
  137.             for(i=0;i<16;i++)
  138.                 if(reg[i]&&i!=0&&i!=1&&i!=8&&i!=9&&i!=6) fprintf(out,"/%s",regnames[i]);
  139.             fprintf(out,"\n\trts\n");
  140.             fclose(out);
  141.             if(loops!=0) break;
  142.             p=varargs[0];loops=3;i=0;
  143. /*            printf("searching %s\n",functionp);*/
  144.             while(p){
  145. /*                printf("  %s\n",p);*/
  146.                 if(!strcmp(p,functionp)){
  147. /*                    printf("found\n");*/
  148.                     functionp=varargs[i+1];
  149.                     loops=0;break;
  150.                 }
  151.                 i+=2;p=varargs[i];
  152.             }
  153.         }
  154.         offset+=6;
  155.     }
  156.     fclose(fd);
  157.     fclose(lvos);
  158. }
  159.  
  160.  
  161. int main(int argc,char **argv)
  162. {
  163.     int i,mode=0;
  164.     for(i=1;i<argc;i++){
  165.         if(!strcmp(argv[i],"-sc")) mode|=SMALLCODE;
  166.         if(!strcmp(argv[i],"-sd")) mode|=SMALLDATA;
  167.     }
  168.     for(i=1;i<argc;i++)
  169.         if(argv[i][0]!='-') ProcessFD(argv[i],mode);
  170. }
  171.